package com.flower.service.impl;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.flower.common.page.PageResponse;
import com.flower.common.page.PageUtils;
import com.flower.common.search.SearchUtils;
import com.flower.mapper.ProductBillDao;
import com.flower.pojo.ProductBill;
import com.flower.pojo.request_param.AddProductBillParam;
import com.flower.pojo.request_param.EditProductBillParam;
import com.flower.pojo.request_param.ProductBillListParam;
import com.flower.response.ResultUtils;
import com.flower.service.ProductBillService;

/**
 * 商品进货service
 * @author 黄静娜
 * @date 2019年12月13日 下午8:42:57
 */
@Service
@Transactional(rollbackFor = Exception.class) 
public class ProductBillServiceImpl implements ProductBillService {
	
	@Autowired
	private ProductBillDao productBillDao;
	
	/**
	 * 分页查询进货商品
	 */
	@Override
	public Object productBillList(ProductBillListParam listParam) {
		//数据校验
		Object result = this.checkList(listParam);
		if(result != null) {
			return result;
		}
		//获取分页数据
		PageResponse pageResponse = this.getProductBillPage(listParam);
		//响应数据
		return ResultUtils.success(pageResponse);
	}
	/**
	 * 获取进货商品分页数据
	 * @author 黄静娜
	 * @date 2019年12月14日 上午10:23:37
	 * @param listParam
	 * @return
	 */
	private PageResponse getProductBillPage(ProductBillListParam listParam) {
		//分页操作数据库
		//1,根据条件获取总记录数
		int pageCount = productBillDao.findProductBillByTitleOrnumberForPageCount(
				listParam);
		//2.根据条件获取分页数据
		List<Map<String, Object>> pageList = productBillDao.findProductBillByTitleOrnumberForPageList(
				PageUtils.countPageStart(listParam.getStartPage(), listParam.getPageTotal()),
				listParam.getPageTotal(),
				listParam);
		//封装分页数据
		PageResponse pageResponse = new PageResponse(
				listParam.getStartPage(), 
				listParam.getPageTotal(), 
				pageCount, 
				pageList);
		return pageResponse;
	}
	/**
	 *  分页查询进货商品数据校验
	 * @author 黄静娜
	 * @date 2019年12月13日 下午9:05:35
	 * @param listParam
	 * @return
	 */
	private Object checkList(ProductBillListParam listParam) {
		//初始化分页参数
		int pageTotal = PageUtils.initialPageTotal(listParam.getPageTotal());
		int pageStart = PageUtils.initialPageStart(listParam.getStartPage());
		listParam.setStartPage(pageStart);
		listParam.setPageTotal(pageTotal);
		
		String productName = listParam.getProductName();
		String number = listParam.getNumber();
		
		//校验商品名称
		if(StringUtils.isNotBlank(productName)) {
			if(productName.length() > 50) {
				return ResultUtils.error("商品名称长度不能超过50", null);
			}
			listParam.setProductName(SearchUtils.filterKeyWord(productName));
		}
		//校验商品编号
		if(StringUtils.isNotBlank(number)) {
			if(number.length() > 11) {
				return ResultUtils.error("商品编号长度不能超过11", null);
			}
			listParam.setNumber(SearchUtils.filterKeyWord(number));
		}
		
		return null;
	}
	/**
	 * 添加进货单
	 */
	@Override
	public Object addProductBill(AddProductBillParam addProductBillParam) {
		//数据校验
		Object result = this.checkAddProductBill(addProductBillParam);
		if(result != null ) {
			return result;
		}
		//将进货单数据添加到指定数据库中
		this.insertAddProductBill(addProductBillParam);
		//友好提示,添加成功
		return ResultUtils.success("添加成功!");
	}
	/**
	 * 添加进货单插入数据
	 * @author 黄静娜
	 * @date 2019年12月14日 下午4:25:26
	 * @param addProductBillParam
	 */
	private void insertAddProductBill(AddProductBillParam addProductBillParam) {
		ProductBill bill = new ProductBill(
				addProductBillParam.getFirmName(), 
				addProductBillParam.getFirmAddress(), 
				addProductBillParam.getFirmPhone(), 
				addProductBillParam.getProductBillCount(), 
				addProductBillParam.getProductBillName(), 
				addProductBillParam.getProductBillNumber(), 
				addProductBillParam.getProductBillPrice());
		productBillDao.insertProductBill(bill);
	}
	/**
	 * 添加进货单数据校验
	 * @author 黄静娜
	 * @date 2019年12月14日 下午4:25:14
	 * @param addProductBillParam
	 * @return
	 */
	private Object checkAddProductBill(AddProductBillParam addProductBillParam) {
		String firmName = addProductBillParam.getFirmName();
		String firmAddress = addProductBillParam.getFirmAddress();
		String firmPhone = addProductBillParam.getFirmPhone();
		String productBillName = addProductBillParam.getProductBillName();
		String productBillNumber = addProductBillParam.getProductBillNumber();
		Integer productBillCount = addProductBillParam.getProductBillCount();
		Double productBillPrice = addProductBillParam.getProductBillPrice();
		
		if(!StringUtils.isNotBlank(firmName) || firmName.length()>100) {
			return ResultUtils.error("厂家名称不能为空/长度不能大于100",null);
		}
		if(!StringUtils.isNotBlank(firmAddress) || firmAddress.length()>100) {
			return ResultUtils.error("厂家地址不能为空/长度不能大于100",null);
		}
		if(!StringUtils.isNotBlank(firmPhone) || firmPhone.length() > 11) {
			return ResultUtils.error("厂家电话不能为空/长度不能大于11",null);
		}
		if(!StringUtils.isNotBlank(productBillName) || productBillName.length()>100) {
			return ResultUtils.error("商品名称不能为空/长度不能大于100",null);
		}
		if(!StringUtils.isNotBlank(productBillNumber) || productBillNumber.length()>11) {
			return ResultUtils.error("商品编号不能为空/长度不能大于11",null);
		}
		if(productBillCount == null || productBillCount>1000000) {
			return ResultUtils.error("商品数量不能为空/超出上限",null);
		}
		if(productBillPrice == null || 
				productBillPrice > 1000000 ||
				productBillPrice < 0.01) {
			return ResultUtils.error("商品进价不能为空/不合法",null);
		}
		return null;
	}
	/**
	 * 修改进货单
	 */
	@Override
	public Object editProductBill(EditProductBillParam editProductBillParam) {
		//数据校验
		Object result = this.checkEditProductBill(editProductBillParam);
		if(result != null) {
			return result;
		}
		//根据参数修改执行表的数据
		this.updateProductBill(editProductBillParam);
		//友好提示 修改成功
		return ResultUtils.success("修改成功~");
	}
	/**
	 * 根据参数修改执行表的数据
	 * @author 黄静娜
	 * @date 2019年12月14日 下午5:35:27
	 * @param editProductBillParam
	 */
	private void updateProductBill(EditProductBillParam editProductBillParam) {
		ProductBill bill = new ProductBill(
				editProductBillParam.getProductBillId(),
				editProductBillParam.getFirmName(), 
				editProductBillParam.getFirmAddress(), 
				editProductBillParam.getFirmPhone(), 
				editProductBillParam.getProductBillCount(), 
				editProductBillParam.getProductBillName(), 
				editProductBillParam.getProductBillNumber(), 
				editProductBillParam.getProductBillPrice());
		productBillDao.updateProductBill(bill);
	}
	/**
	 * 修改进货单数据校验
	 * @author 黄静娜
	 * @date 2019年12月14日 下午5:35:01
	 * @param editProductBillParam
	 * @return
	 */
	private Object checkEditProductBill(EditProductBillParam editProductBillParam) {
		String productBillId = editProductBillParam.getProductBillId();
		//校验id
		if(!StringUtils.isNotBlank(productBillId) || productBillId.length() > 36) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		boolean flag = productBillDao.isExistProductBillById(productBillId);
		if(!flag) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		Object result = this.checkAddProductBill(editProductBillParam);
		if(result != null) {
			return result;
		}
		return null;
	}
	/**
	 * 修改进货单页面跳转
	 */
	@Override
	public Object showProductBill(String productBillId) {
		//数据校验
		Object result = this.checkShowProductBill(productBillId);
		if(result != null) {
			return result;
		}
		//根据id获取需要的数据
		Map<String, Object> data = productBillDao.findProductBillById(productBillId);
		//封装业务数据
		return ResultUtils.success(data);
	}
	/**
	 * 修改进货单页面跳转数据校验
	 * @author 黄静娜
	 * @date 2019年12月14日 下午6:07:59
	 * @param productBillId
	 * @return
	 */
	private Object checkShowProductBill(String productBillId) {
		//校验id
		if(!StringUtils.isNotBlank(productBillId) || productBillId.length() > 36) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		boolean flag = productBillDao.isExistProductBillById(productBillId);
		if(!flag) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		return null;
	}
	/**
	 * 删除进货单
	 */
	@Override
	public Object deleteProductBill(String productBillId) {
		//数据校验
		Object result = this.checkShowProductBill(productBillId);
		if(result != null) {
			return result;
		}
		//根据id删除数据
		productBillDao.deleteProductBillById(productBillId);
		//友好提示 删除成功
		return ResultUtils.success("删除成功~");
	}
	
	
}
